package leetcode_201_220;

import java.util.HashSet;

public class isHappy_202 {
    /**
     * 题目证明在leetcode官方解中
     * @param n
     * @return
     */
    public boolean isHappy(int n) {
        /**
         * 1,最终会得到 1。
         * 2,最终会进入循环。
         * 3,值会越来越大，最后接近无穷大。
         * 第三种情况被证明为假
         * 进入循环后，会不断产生重复数字
         * 1,利用hash集合验证
         * 2，快慢指针，类似之前的链表公共前缀
         */
//        HashSet<Integer> set=new HashSet<>();
//        set.add(n);
//        while(n!=1){
//            n=sum(n);
//            if(set.contains(n))
//                return false;
//            set.add(n);
//        }
//        return true;
        int slow=n,fast=sum(n);
        while( n!=1 && slow !=fast){
            slow=sum(slow);
            fast=sum(sum(fast));
        }
        return fast==1;
    }

    public int sum(int n){
        int ans=0;
        while (n!=0){
            int t=n%10;
            n/=10;
            ans+=t*t;
        }
        return ans;
    }
}
